package com.findMoneyGame.pages.preloading {
	import flash.events.Event;

	import com.findMoneyGame.models.User;
	import com.findMoneyGame.api.ApiWrapper;
	import com.findMoneyGame.pages.preloading.ThePreloader;
	import com.findMoneyGame.pages.preloading.PreloaderState;

	public class UserIdFetchingState extends PreloaderState {
		private static const LOADING_PARTS_LOADED = 1;
		private var apiWrapper = new ApiWrapper();


		public function UserIdFetchingState (thePreloader : ThePreloader) { super(thePreloader); }

		public function start () {
			trace('Состояние прелоадера: получение Id пользователя');
			// подготавливаем обработчики событий объекта apiWrapper: на успешное получение id пользователя и ошибку
			apiWrapper.addEventListener(ApiWrapper.CURRENT_USER_ID_FETCHED, userIdFetched);
			apiWrapper.addEventListener(ApiWrapper.CURRENT_USER_ID_FETCHING_ERROR, userIdFetchingError);
			// запускаем асинхронный процесс получения id пользователя
			apiWrapper.beginFetchCurrUserId();
			// подписываемся на событие вхождения в кадр времени на процедуру заполнения полосы загрузки в зависимости от того насколько загрузился id пользователя
			thePreloader.addEventListener(Event.ENTER_FRAME, checkUserIdFetching);
		}
		private function userIdFetched (e : Event) {
			unsubscribe();
			user.id = apiWrapper.currentUserId;
			new UserExistsCheckingState(thePreloader).start();
		}
		private function userIdFetchingError (e : Event) {
			unsubscribe();
			var errorPage = new LoadingErrorPage();
			errorPage.x = 40;
			errorPage.y = 40;
			thePreloader.addChild(errorPage);
		}
		private function checkUserIdFetching (e: Event) {
			var progress = user.bytesTotal == 0 ? 0 : user.bytesLoaded / user.bytesTotal;
			thePreloader.setPreloadingPercent((LOADING_PARTS_LOADED + progress) / LOADING_PARTS_COUNT);
		}
		private function unsubscribe () {
			thePreloader.removeEventListener(Event.ENTER_FRAME, checkUserIdFetching);
			apiWrapper.removeEventListener(ApiWrapper.CURRENT_USER_ID_FETCHED, userIdFetched);
			apiWrapper.removeEventListener(ApiWrapper.CURRENT_USER_ID_FETCHING_ERROR, userIdFetchingError);
		}
	}
}